#ifndef FILE_MANAGER_H
#define FILE_MANAGER_H

/*****************************************************************************************
  @Copyright  2020-2021
  @Date       2021-02-22
  @Author     qiaowei
  @Contact    weiweiqiao@126.com
  @Version    1.0
  @Brief      根据用户操作，将操作分发不同类进行处理
  @Other      被MainWindow类调用
  @History
      @Date   20210222
      @Author qiaowei
      @Brief  增加sig_exit_application信号，接收用户的退出程序信号
              增加init_connections方法，初始化信号槽
              增加slot_exit_application方法，退出程序

      @Date   20210223
      @Author qiaowei
      @Brief  增加si_open_file_to_split_data信号，接收用户拆分数据保存到不同文件的操作
              增加sl_open_file_to_split_data槽方法，处理拆分文件数据操作
              增加si_read_data_from_file信号，接收用户展示数据到View的操作
              增加sl_read_data_from_file槽方法，处理展示数据操作

      @Date   20210224
      @Author qiaowei
      @Brief  增加file_process_thread_，file_process_变量，多线程
  @Functions  None
******************************************************************************************/

#include <QObject>
#include <QThread>
#include <QMap>

class File_process;

class File_manager : public QObject
{
    Q_OBJECT
public:
    explicit File_manager(QObject *parent = nullptr);
    ~File_manager();

signals:
    /***************************************************************************
     @date     2021-02-22
     @author   qiaowei
     @contact  weiweiqiao@126.com
     @version  1.0
     @brief    退出程序信号，与slot_exit_application槽方法绑定
    ***************************************************************************/
    void si_exit_();

    /***************************************************************************
     @date     2021-02-24
     @author   qiaowei
     @contact  weiweiqiao@126.com
     @version  1.0
     @brief    传递用户拆分数据保存到不同文件的操作
    ***************************************************************************/
    void si_open_file_to_split_data();

    /***************************************************************************
     @date     2021-02-24
     @author   qiaowei
     @contact  weiweiqiao@126.com
     @version  1.0
     @brief    传递用户展示数据到View的操作
    ***************************************************************************/
    void si_read_data_from_file();

    /***************************************************************************
     @date     2021-02-25
     @author   qiaowei
     @contact  weiweiqiao@126.com
     @version  1.0
     @brief    传递要分解数据的文件名列表
     @param    files_list 文件名列表
    ***************************************************************************/
    void si_files_name_of_split_data(QStringList files_list);

    /***************************************************************************
     @date     2021-02-25
     @author   qiaowei
     @contact  weiweiqiao@126.com
     @version  1.0
     @brief    传递要读取数据的文件名列表
     @param    files_list 文件名列表
    ***************************************************************************/
    void si_files_name_of_readed_data(QStringList files_list);

    /***************************************************************************
     @date     2021-02-25
     @author   qiaowei
     @contact  weiweiqiao@126.com
     @version  1.0
     @brief    传递航迹track数据，数据保存在字典map
     @param    map 保存航迹数据的字典
    ***************************************************************************/
    void si_send_track_to_model(QMap<QString, QString>* map);

    /***************************************************************************
     @date     2021-03-06
     @author   qiaowei
     @contact  weiweiqiao@126.com
     @version  1.0
     @brief    发送用户选择条件
     @param    map 用户选择条件
    ***************************************************************************/
    void si_fetch_filter_conditions(QMap<QString, QString> map);

private:
    /***************************************************************************
     @date     2021-02-22
     @author   qiaowei
     @contact  weiweiqiao@126.com
     @version  1.0
     @brief    初始化信号槽
    ***************************************************************************/
    void init_connections();

    /***************************************************************************
     @date     2021-02-24
     @author   qiaowei
     @contact  weiweiqiao@126.com
     @version  1.0
     @brief    判断子线程thread是否启动，将变量迁入子线程thread，并启动
     @param    thread 子线程
     @param    process* 迁入子线程的对象
    ***************************************************************************/
    void start_thread(QThread& thread, QObject* process);

private slots:
    /***************************************************************************
     @date     2021-02-24
     @author   qiaowei
     @contact  weiweiqiao@126.com
     @version  1.0
     @brief    退出程序
    ***************************************************************************/
    void sl_exit_();

    /***************************************************************************
     @date     2021-02-24
     @author   qiaowei
     @contact  weiweiqiao@126.com
     @version  1.0
     @brief    用户拆分数据保存到不同文件
    ***************************************************************************/
    void sl_open_file_to_split_data();

    /***************************************************************************
     @date     2021-02-24
     @author   qiaowei
     @contact  weiweiqiao@126.com
     @version  1.0
     @brief    处理展示数据操作
    ***************************************************************************/
    void sl_read_data_from_file();

private:
    /***************************************************************************
     @date     2021-02-25
     @author   qiaowei
     @contact  weiweiqiao@126.com
     @version  1.0
     @brief    子线程，运行file_process_变量
    ***************************************************************************/
    QThread file_process_thread_;

    File_process* file_process_;
};

#endif // FILE_MANAGER_H
